package com.mexcad.reports;

import java.awt.Color;
import java.io.IOException;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperManager;
import net.sf.jasperreports.engine.JasperPrint;

import org.hibernate.Session;

import com.lowagie.text.Chunk;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.Font;
import com.lowagie.text.FontFactory;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.PdfWriter;
import com.mexcad.db.connectors.CreditoConnector;
import com.mexcad.db.connectors.ReportConnectors;
import com.mexcad.db.connectors.SolicitudConnector;
import com.mexcad.db.delegate.DelegateConnectors;
import com.mexcad.db.dto.CargoPago;
import com.mexcad.db.dto.Cliente;
import com.mexcad.db.dto.Credito;
import com.mexcad.db.dto.Renta;
import com.mexcad.db.utils.HibernateUtil;
import com.mexcad.reports.utils.DataType;
import com.mexcad.reports.utils.DocumentsAdds;
import com.mexcad.reports.utils.PDFDocumentException;
import com.mexcad.reports.utils.PDFTable;
import com.mexcad.utils.Constantes;
import com.mexcad.utils.Formatter;
import java.sql.Timestamp;

public class AbonoCreditosServletReport extends HttpServlet {
	
		private PdfWriter writer; 
		private String titulo="Abono a Cr�ditos";

		protected void doPost(HttpServletRequest req, HttpServletResponse res)
		throws ServletException, IOException {
		
			try {
				Document doc =  new Document(PageSize._11X17.rotate(), 25, 25, 25, 50);
				writer=   PdfWriter.getInstance(doc, res.getOutputStream());
				writer.setViewerPreferences(PdfWriter.PageModeUseThumbs);
				writer.setLinearPageMode();
				writer.setPageEvent( new DocumentsAdds.MyPageEvents());
				
				DocumentsAdds.addMetaData(doc, "Documento Test");
				doc.open();
				
				String fechaIni= req.getParameter("fecha_ini");
				String fechaFin= req.getParameter("fecha_fin");
				PDFTable pdfTable=null;
				
				if(fechaIni != null && fechaFin!= null){
					
					Integer entregasParciales=req.getParameter("entregasParciales")!=null?new Integer(req.getParameter("entregasParciales")):new Integer(0);
					Integer especialFinal=req.getParameter("especialFinal")!=null?new Integer(req.getParameter("especialFinal")):new Integer(0);
					Integer normal=req.getParameter("normal")!=null?new Integer(req.getParameter("normal")):new Integer(0);
					Integer normaliva=req.getParameter("normaliva")!=null?new Integer(req.getParameter("normaliva")):new Integer(0);
					Integer unam=req.getParameter("unam")!=null?new Integer(req.getParameter("unam")):new Integer(0);
					Integer especial=req.getParameter("especial")!=null?new Integer(req.getParameter("especial")):new Integer(0);
					Integer unamIva=req.getParameter("unamIva")!=null?new Integer(req.getParameter("unamIva")):new Integer(0);
					
					
					DocumentsAdds.addSimpleHeader(doc, titulo, fechaIni, fechaFin);
					
		//			List<Credito> list = ReportConnectors.getAllCreditosByPeriodoAndEsquemaCredito(fechaIni, fechaFin,
		//												  especial,unam, normaliva,normal,especialFinal, entregasParciales, unamIva  );
					Map<Integer,String> mapClientes = ReportConnectors.getAllClientes();
						
					if( mapClientes!=null){
						List<Object []> lista =  ReportConnectors.getAllRentasCreditosDeCargoPagoByPeriodo(fechaIni,fechaFin);
						String []header =new String[]{"Num. Crédito", "Nombre del Cliente","Fecha de registro", "Fecha exigible","Monto",
			  					 "Capital","Interés","Impuesto","Cuota"};
						float []tamCols =new float[]{1,2.5f ,1.5f,1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f   };
						List<DataType []> listadoDatos = new ArrayList<DataType []>();
		
						
						for(Iterator<Object []> it = lista.iterator();it.hasNext();){
							Object [] cp = (Object [])it.next();
							Credito cred= CreditoConnector.getCreditoPorId((Integer)cp[1]);
							
						  if(cred.getCkCredito().getIdEsquemaCredito()==entregasParciales || 
							   cred.getCkCredito().getIdEsquemaCredito()==especialFinal || 
							   cred.getCkCredito().getIdEsquemaCredito()==normal || 
							   cred.getCkCredito().getIdEsquemaCredito()==normaliva || 
							   cred.getCkCredito().getIdEsquemaCredito()==unam || 
							   cred.getCkCredito().getIdEsquemaCredito()==especial || 
							   cred.getCkCredito().getIdEsquemaCredito()==unamIva ){
							  
							  	
							
							
							Renta renta = ReportConnectors.getRentaPorId((Integer)cp[0]);
							List<CargoPago> listadoPagos= ReportConnectors.consultaPagosParaRentaCredito((Integer)cp[0],(Integer)cp[1],fechaIni,fechaFin);
							
							for(int i=0;i<listadoPagos.size();++i){
								DataType []datos = new DataType[header.length];
								CargoPago cargoPago = listadoPagos.get(i);
								
								 datos[0]= new DataType();
								 datos[0].setAlignMode(Element.ALIGN_CENTER);
								 datos[0].setData(cargoPago.getCkCargoPago().getIdCredito());
								 datos[0].setDataType(DataType.STRING_TYPE);
		
								 datos[1]= new DataType();
								 datos[1].setAlignMode(Element.ALIGN_LEFT);
								 datos[1].setData(mapClientes.get(cred.getCkCredito().getIdCliente()));
								 datos[1].setDataType(DataType.STRING_TYPE);
		
								 datos[2]= new DataType();
								 datos[2].setAlignMode(Element.ALIGN_CENTER);
								 datos[2].setData(Formatter.getStringFromDate(cargoPago.getFechaRegistro()));
								 datos[2].setDataType(DataType.STRING_TYPE);
		
								 datos[3]= new DataType();
								 datos[3].setAlignMode(Element.ALIGN_CENTER);
								 datos[3].setData(Formatter.getStringFromDate(renta.getFechaExigible()));
								 datos[3].setDataType(DataType.STRING_TYPE);
		
								 datos[4]= new DataType();
								 datos[4].setAlignMode(Element.ALIGN_RIGHT);
								 datos[4].setData(cargoPago.getAbono());
								 datos[4].setDataType(DataType.CURRENCY_TYPE);
		
								 datos[5]= new DataType();
								 datos[5].setAlignMode(Element.ALIGN_RIGHT);
								 datos[5].setData(cargoPago.getCapital());
								 datos[5].setDataType(DataType.CURRENCY_TYPE);
		
								 datos[6]= new DataType();
								 datos[6].setAlignMode(Element.ALIGN_RIGHT);
								 datos[6].setData(cargoPago.getIntereses());
								 datos[6].setDataType(DataType.CURRENCY_TYPE);
								
								 datos[7]= new DataType();
								 datos[7].setAlignMode(Element.ALIGN_RIGHT);
								 datos[7].setData(cargoPago.getImpuestos());
								 datos[7].setDataType(DataType.CURRENCY_TYPE);
								
								 datos[8]= new DataType();
								 datos[8].setAlignMode(Element.ALIGN_RIGHT)	;
								 datos[8].setData(cargoPago.getOtros());
								 datos[8].setDataType(DataType.CURRENCY_TYPE);
								
								 listadoDatos.add(datos);
							}
						  }
						}
						
						pdfTable = new PDFTable(tamCols,header,listadoDatos);
						doc.add(pdfTable.getTable());
					}
					
					
					
				}else{
					Paragraph p = new Paragraph("Error al generar el documento",FontFactory.getFont(FontFactory.COURIER, 28, Font.BOLD, new Color(0, 0, 0)));
					doc.add(p);
				}
				
				doc.add (Chunk.NEWLINE);
				doc.add (Chunk.NEWLINE);
				doc.close();
				
			} catch (DocumentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (PDFDocumentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		

		protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1)
				throws ServletException, IOException {
			doPost(arg0, arg1);
		}
}



/*queryReporte
 * 


select mon.descMoneda,  tipSol.desctiposolicitud, clt.nombreCliente,
esqCred.descesquemacredito, estSol.descestatussolicitud, perSol.descperiodosolicitado,
tasBas.desctasabase, eje.nombres ||' ' ||eje.apellidopaterno ||' ' ||eje.apellidomaterno as nomEjecutivo,
sol.apellidopaterno ||' ' || sol.apellidomaterno ||' ' || sol.nombressolicitante as solicitante
from 

solicitud sol, cat_moneda mon, cat_tiposolicitud tipSol, cliente clt, 
cat_esquemaCredito esqCred, cat_estatussolicitud estSol, cat_periodosolicitado perSol,
cat_tasaBase tasBas,Ejecutivo eje

where 

 mon.idMoneda = sol.idMoneda AND sol.idTipoSOlicitud= tipSol.idTipoSolicitud AND
 clt.idcliente = sol.idCliente AND esqCred.idEsquemaCredito = sol.idEsquemaCredito AND 
 estSol.idestatussolicitud = sol.idestatussolicitud AND 
 perSol.idperiodosolicitado = sol.idperiodosolicitado AND
 tasBas.idtasabase = sol.idtasabase AND
 eje.idEjecutivo = sol.idEjecutivo AND sol.idSolicitud =1
 



 * */

